﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Процедура-обработчик закрытия формы настройки узлов плана обмена.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана процедура.
// 
Процедура ФормаНастройкиУзловКомандаЗакрытьФорму(Форма) Экспорт
	
	Если Не Форма.ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	Форма.Модифицированность = Ложь;
	ЗаполнитьДанныеСтруктуры(Форма);
	Форма.Закрыть(Форма.Контекст);
	
КонецПроцедуры

// Процедура-обработчик закрытия формы настройки узла плана обмена.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана процедура.
// 
Процедура ФормаНастройкиУзлаКомандаЗакрытьФорму(Форма) Экспорт
	
	ПриЗакрытииФормыНастройкиУзлаПланаОбмена(Форма, "НастройкаОтборовНаУзле");
	
КонецПроцедуры

// Процедура-обработчик закрытия формы настройки значений по умолчанию узла плана обмена.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма, из которой вызвана процедура.
// 
Процедура ФормаНастройкиЗначенийПоУмолчаниюКомандаЗакрытьФорму(Форма) Экспорт
	
	ПриЗакрытииФормыНастройкиУзлаПланаОбмена(Форма, "ЗначенияПоУмолчаниюНаУзле");
	
КонецПроцедуры

// Процедура-обработчик закрытия формы настройки узла плана обмена.
//
// Параметры:
//  Отказ            - Булево           - признак отказа от закрытия формы.
//  Форма            - ФормаКлиентскогоПриложения - форма, из которой вызвана процедура.
//  ЗавершениеРаботы - Булево           - признак того, что форма закрывается в процессе завершения работы приложения.
// 
// Пример:
//
//	&НаКлиенте
//	Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
//		ОбменДаннымиКлиент.ФормаНастройкиПередЗакрытием(Отказ, ЭтотОбъект, ЗавершениеРаботы);
//	КонецПроцедуры
//
Процедура ФормаНастройкиПередЗакрытием(Отказ, Форма, ЗавершениеРаботы) Экспорт
	
	ИмяПроцедуры = "ОбменДаннымиКлиент.ФормаНастройкиПередЗакрытием";
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Отказ", Отказ, Тип("Булево"));
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Форма", Форма, Тип("ФормаКлиентскогоПриложения"));
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "ЗавершениеРаботы", ЗавершениеРаботы, Тип("Булево"));
	
	Если Не Форма.Модифицированность Тогда
		Возврат;
	КонецЕсли;
		
	Отказ = Истина;
	
	Если ЗавершениеРаботы Тогда
		Возврат;
	КонецЕсли;
	
	ТекстВопроса = НСтр("ru = 'Данные были изменены. Закрыть форму без сохранения изменений?'");
	ОписаниеОповещения = Новый ОписаниеОповещения("ФормаНастройкиПередЗакрытиемЗавершение", ЭтотОбъект, Форма);
	ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет);
	
КонецПроцедуры

// Открывает форму помощника настройки обмена данными для заданного плана обмена.
//
// Параметры:
//  ИмяПланаОбмена         - Строка - имя плана обмена, как объекта метаданных,
//                                    для которого необходимо открыть помощник.
//  ИдентификаторНастройки - Строка - идентификатор варианта настройки обмена данными.
// 
Процедура ОткрытьПомощникНастройкиОбменаДанными(Знач ИмяПланаОбмена, Знач ИдентификаторНастройки) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ИмяПланаОбмена", ИмяПланаОбмена);
	ПараметрыФормы.Вставить("ИдентификаторНастройки", ИдентификаторНастройки);
	
	КлючФормы = ИмяПланаОбмена + "_" + ИдентификаторНастройки;
	
	ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НастройкаПодключения", ПараметрыФормы, ,
		КлючФормы, , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

// Обработчик начала выбора элемента для формы задания настроек узла базы-корреспондента при настройке обмена через
// внешнее соединение.
//
// Параметры:
//  ИмяРеквизита - Строка - имя реквизита формы.
//  ИмяТаблицы - Строка - полное имя объекта метаданных.
//  Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента.
//  СтандартнаяОбработка - Булево - признак выполнения стандартной (системной) обработки события.
//  ПараметрыВнешнегоСоединения - Структура
//  ПараметрыВыбора - Структура - структура параметров выбора.
//
Процедура ОбработчикВыбораЭлементовБазыКорреспондентаНачалоВыбора(Знач ИмяРеквизита, Знач ИмяТаблицы, Знач Владелец,
	Знач СтандартнаяОбработка, Знач ПараметрыВнешнегоСоединения, Знач ПараметрыВыбора=Неопределено) Экспорт
	
	ИмяРеквизитаИдентификатора = ИмяРеквизита + "_Ключ";
	
	НачальноеЗначениеВыбора = Неопределено;
	ВыборГруппИЭлементов    = Неопределено;
	
	ТипВладельца = ТипЗнч(Владелец);
	Если ТипВладельца=Тип("ТаблицаФормы") Тогда
		ТекущиеДанные = Владелец.ТекущиеДанные;
		Если ТекущиеДанные<>Неопределено Тогда
			НачальноеЗначениеВыбора = ТекущиеДанные[ИмяРеквизитаИдентификатора];
		КонецЕсли;
		
	ИначеЕсли ТипВладельца=Тип("ФормаКлиентскогоПриложения") Тогда
		НачальноеЗначениеВыбора = Владелец[ИмяРеквизитаИдентификатора];
		
	КонецЕсли;
	
	Если ПараметрыВыбора<>Неопределено Тогда
		Если ПараметрыВыбора.Свойство("ВыборГруппИЭлементов") Тогда
			ВыборГруппИЭлементов = ПараметрыВыбора.ВыборГруппИЭлементов;
		КонецЕсли;
	КонецЕсли;
	
	СтандартнаяОбработка = Ложь;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПараметрыВнешнегоСоединения",        ПараметрыВнешнегоСоединения);
	ПараметрыФормы.Вставить("ПолноеИмяТаблицыБазыКорреспондента", ИмяТаблицы);
	ПараметрыФормы.Вставить("НачальноеЗначениеВыбора",            НачальноеЗначениеВыбора);
	ПараметрыФормы.Вставить("ИмяРеквизита",                       ИмяРеквизита);
	ПараметрыФормы.Вставить("ВыборГруппИЭлементов",               ВыборГруппИЭлементов);
	
	ОткрытьФорму("ОбщаяФорма.ВыборОбъектовИнформационнойБазыКорреспондента", ПараметрыФормы, Владелец);
	
КонецПроцедуры

// Обработчик подбора элементов для формы задания настроек узла базы-корреспондента при настройке обмена через внешнее
// соединение.
//
// Параметры:
//  ИмяРеквизита - Строка - имя реквизита формы.
//  ИмяТаблицы - Строка - полное имя объекта метаданных.
//  Владелец - ФормаКлиентскогоПриложения - форма выбора элементов базы-корреспондента.
//  ПараметрыВнешнегоСоединения - Структура
//  ПараметрыВыбора - Структура - структура параметров выбора.
//
Процедура ОбработчикВыбораЭлементовБазыКорреспондентаПодбор(Знач ИмяРеквизита, Знач ИмяТаблицы, Знач Владелец,
	Знач ПараметрыВнешнегоСоединения, Знач ПараметрыВыбора=Неопределено) Экспорт
	
	ИмяРеквизитаИдентификатора = ИмяРеквизита + "_Ключ";
	
	НачальноеЗначениеВыбора = Неопределено;
	ВыборГруппИЭлементов    = Неопределено;
	
	ТекущиеДанные = Владелец.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		НачальноеЗначениеВыбора = ТекущиеДанные[ИмяРеквизитаИдентификатора];
	КонецЕсли;
	
	Если ПараметрыВыбора <> Неопределено Тогда
		Если ПараметрыВыбора.Свойство("ВыборГруппИЭлементов") Тогда
			ВыборГруппИЭлементов = ПараметрыВыбора.ВыборГруппИЭлементов;
		КонецЕсли;
	КонецЕсли;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПараметрыВнешнегоСоединения",        ПараметрыВнешнегоСоединения);
	ПараметрыФормы.Вставить("ПолноеИмяТаблицыБазыКорреспондента", ИмяТаблицы);
	ПараметрыФормы.Вставить("НачальноеЗначениеВыбора",            НачальноеЗначениеВыбора);
	ПараметрыФормы.Вставить("ЗакрыватьПриВыборе",                 Ложь);
	ПараметрыФормы.Вставить("ИмяРеквизита",                       ИмяРеквизита);
	ПараметрыФормы.Вставить("ВыборГруппИЭлементов",               ВыборГруппИЭлементов);
	
	ОткрытьФорму("ОбщаяФорма.ВыборОбъектовИнформационнойБазыКорреспондента", ПараметрыФормы, Владелец);
КонецПроцедуры

// Обработчик обработки выбора элемента для формы задания настроек узла базы-корреспондента при настройке обмена через
// внешнее соединение.
//
// Параметры:
//  Элемент - ФормаКлиентскогоПриложения
//          - ТаблицаФормы - элемент для обработки выбора.
//  ВыбранноеЗначение - Произвольный - см. описание параметра ВыбранноеЗначение события ОбработкаВыбора.
//  ДанныеФормыКоллекция - ДанныеФормыКоллекция - для режима подбора из списка.
//
Процедура ОбработчикВыбораЭлементовБазыКорреспондентаОбработкаВыбора(Знач Элемент, Знач ВыбранноеЗначение, Знач ДанныеФормыКоллекция=Неопределено) Экспорт
	
	Если ТипЗнч(ВыбранноеЗначение)<>Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	ИмяРеквизитаИдентификатора = ВыбранноеЗначение.ИмяРеквизита + "_Ключ";
	ИмяРеквизитаПредставления  = ВыбранноеЗначение.ИмяРеквизита;
	
	ТипЭлемента = ТипЗнч(Элемент);
	Если ТипЭлемента=Тип("ТаблицаФормы") Тогда
		
		Если ВыбранноеЗначение.РежимПодбора Тогда
			Если ДанныеФормыКоллекция<>Неопределено Тогда
				Фильтр = Новый Структура(ИмяРеквизитаИдентификатора, ВыбранноеЗначение.Идентификатор);
				СуществующиеСтроки = ДанныеФормыКоллекция.НайтиСтроки(Фильтр);
				Если СуществующиеСтроки.Количество() > 0 Тогда
					Возврат;
				КонецЕсли;
			КонецЕсли;
			
			Элемент.ДобавитьСтроку();
		КонецЕсли;
		
		ТекущиеДанные = Элемент.ТекущиеДанные;
		Если ТекущиеДанные<>Неопределено Тогда
			ТекущиеДанные[ИмяРеквизитаИдентификатора] = ВыбранноеЗначение.Идентификатор;
			ТекущиеДанные[ИмяРеквизитаПредставления]  = ВыбранноеЗначение.Представление;
		КонецЕсли;
		
	ИначеЕсли ТипЭлемента=Тип("ФормаКлиентскогоПриложения") Тогда
		Элемент[ИмяРеквизитаИдентификатора] = ВыбранноеЗначение.Идентификатор;
		Элемент[ИмяРеквизитаПредставления]  = ВыбранноеЗначение.Представление;
		
	КонецЕсли;
	
КонецПроцедуры

// Проверяет установку флага "Использовать" для всех строк таблицы.
//
// Параметры:
//  Таблица - ТаблицаЗначений - проверяемая таблица.
//
// Возвращаемое значение:
//  Булево - признак использования всех элементов.
//
Функция ВТаблицеОтмеченыВсеЭлементы(Таблица) Экспорт
	
	Для Каждого Элемент Из Таблица Цикл
		
		Если Элемент.Использовать = Ложь Тогда
			
			Возврат Ложь;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Истина;
КонецФункции

// Выполняет удаление настройки синхронизации данных.
//
// Параметры:
//   УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, соответствующий отключаемому обмену.
//
Процедура УдалитьНастройкуСинхронизации(Знач УзелИнформационнойБазы) Экспорт
	
	Если ОбменДаннымиВызовСервера.УзелЯвляетсяГлавным(УзелИнформационнойБазы) Тогда
		ТекстПредупреждения = НСтр("ru = 'Отключение информационной базы от главного узла можно выполнить
			|с помощью параметра запуска конфигуратора /ResetMasterNode.'");
		ПоказатьПредупреждение(, ТекстПредупреждения);
	Иначе
		ПараметрыПомощника = Новый Структура;
		ПараметрыПомощника.Вставить("УзелОбмена", УзелИнформационнойБазы);
		
		ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.УдалениеНастройкиСинхронизации", ПараметрыПомощника);
	КонецЕсли;
	
КонецПроцедуры

// Процедура-обработчик записи узла плана обмена. При необходимости выполняет запись узла при помощи длительной операции
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - узел плана обмена.
//  Отказ - Булево - признак отказа от записи узла плана обмена.
//  ПараметрыЗаписи - Структура - произвольные параметры записи. См. описание события ПослеЗаписи в синтакс-помощнике.
//
Процедура ПередЗаписью(Форма, Отказ, ПараметрыЗаписи) Экспорт
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	РезультатПроверки = ОбменДаннымиВызовСервера.ПроверитьНеобходимостьОтложеннойЗаписиУзла(Форма.Объект);
	
	Если РезультатПроверки.ЕстьАктивноеФоновоеЗадание Тогда 
					
		ТекстПредупреждения = НСтр("ru = 'Уже выполняется отложенная операция записи узла.
										|Повторите попытку позже'");
		
		ПоказатьПредупреждение(, ТекстПредупреждения);

		Отказ = Истина;	
		
	ИначеЕсли РезультатПроверки.НеобходимаДлительнаяОперация Тогда
		
		Объект = Форма.Объект; //ПланОбменаОбъект
		
		ПараметрыОбработки = Новый Структура;
		ПараметрыОбработки.Вставить("Узел", 				Объект.Ссылка);
		ПараметрыОбработки.Вставить("АдресСтруктурыУзла", 	РезультатПроверки.АдресСтруктурыУзла);
		
		Форма.Модифицированность = Ложь;
		Форма.Закрыть();
		
		ОткрытьФорму("Обработка.ОтложеннаяЗаписьУзла.Форма.Форма", ПараметрыОбработки,,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

		Отказ = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

// Процедура-обработчик навигационной ссылки в форме узла для элементов созданных программно.
// Только при работе в модели сервиса.
//
// Параметры:
//  Форма - ФормаКлиентскогоПриложения - узел плана обмена.
//  Элемент - ЭлементыФормы
//  НавигационнаяСсылка -  Строка - сформированная навигационная ссылка
//  СтандартнаяОбработка - Булево
//
Процедура ОбработкаНавигационнойСсылкиВФормеУзла(Форма, Элемент, НавигационнаяСсылка, СтандартнаяОбработка) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда
		МодульОбменДаннымиВнутренняяПубликацияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиВнутренняяПубликацияКлиент");
		МодульОбменДаннымиВнутренняяПубликацияКлиент.ОбработкаНавигационнойСсылкиВФормеУзла(
			Форма, НавигационнаяСсылка, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

// Открывает панель настройки синхронизации данных.
//
// Параметры:
//  ПараметрКоманды - Структура
//                  - Неопределено
//  ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды
//
Процедура ОткрытьПанельСинхронизацииДанных(ПараметрКоманды, ПараметрыВыполненияКоманды) Экспорт
	
	ИмяОбработки      = "";
	ИмяФормыОбработки = "";
	
	Если СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда
		Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("ОбменДаннымиНастройкиПрограммы") Тогда
			ИмяОбработки      = "ПанельАдминистрированияБСД";
			ИмяФормыОбработки = "СинхронизацияДанных";
		ИначеЕсли ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда
			ИмяОбработки      = "ПанельАдминистрированияБСП";
			ИмяФормыОбработки = "СинхронизацияДанных";
		КонецЕсли;	
	Иначе
		Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("ТехнологияСервиса") Тогда
			Возврат;
		КонецЕсли;
		
		ИмяОбработки      = "ПанельАдминистрированияБСПВМоделиСервиса";
		ИмяФормыОбработки = "СинхронизацияДанныхДляАдминистратораСервиса";
	КонецЕсли;
	
	Если ИмяОбработки = "" Тогда
		Возврат;
	КонецЕсли;
	
	ИмяОткрываемойФормы = "Обработка.[ИмяОбработки].Форма.[ИмяФормыОбработки]";
	ИмяОткрываемойФормы = СтрЗаменить(ИмяОткрываемойФормы, "[ИмяОбработки]", ИмяОбработки);
	ИмяОткрываемойФормы = СтрЗаменить(ИмяОткрываемойФормы, "[ИмяФормыОбработки]", ИмяФормыОбработки);
	
	ОткрытьФорму(
		ИмяОткрываемойФормы,
		Новый Структура,
		ПараметрыВыполненияКоманды.Источник,
		ИмяОткрываемойФормы + ?(ПараметрыВыполненияКоманды.Окно = Неопределено, ".ОтдельноеОкно", ""),
		ПараметрыВыполненияКоманды.Окно);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Открывает модально журнал регистрации с отбором по событиям выгрузки или загрузки данных для заданного узла плана
// обмена.
//
Процедура ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, Владелец, ДействиеПриОбмене) Экспорт
	
	// вызов сервера
	ПараметрыФормы = ОбменДаннымиВызовСервера.ДанныеОтбораЖурналаРегистрации(УзелИнформационнойБазы, ДействиеПриОбмене);
	
	ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, Владелец);
	
КонецПроцедуры

// Возвращает имя формы сообщения о неудачном обновлении при ошибке в ПРО при выполнении обновления информационной базы.
// 
// Возвращаемое значение:
//  Строка - имя формы сообщения о неудачном обновлении.
//
Функция ИмяФормыСообщенияОНеудачномОбновлении() Экспорт
	
	Возврат "РегистрСведений.ПравилаДляОбменаДанными.Форма.СообщениеОНеудачномОбновлении";
	
КонецФункции

// Обновляет конфигурацию базы данных.
//
Процедура УстановитьОбновлениеКонфигурации(ЗавершениеРаботыСистемы = Ложь) Экспорт
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
		МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент");
		МодульОбновлениеКонфигурацииКлиент.УстановитьОбновлениеКонфигурации(ЗавершениеРаботыСистемы);
	Иначе
		ОткрытьФорму("ОбщаяФорма.ДополнительноеОписание", Новый Структура("Заголовок,ИмяМакета",
		НСтр("ru = 'Установка обновления'"), "ИнструкцияКакВыполнитьУстановкуОбновленияВручную"));
	КонецЕсли;
	
КонецПроцедуры

// Открывает форму монитора зарегистрированных к отправке данных.
//
Процедура ОткрытьСоставОтправляемыхДанных(Знач УзелИнформационнойБазы) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("УзелОбмена", УзелИнформационнойБазы);
	ПараметрыФормы.Вставить("ЗапрещеноВыбиратьУзелОбмена", Истина);
	
	// Служебные данные, которые нельзя править при доступе к обработке через команду.
	ПараметрыФормы.Вставить("ИменаСкрываемыхМетаданных", Новый СписокЗначений);
	ПараметрыФормы.ИменаСкрываемыхМетаданных.Добавить("РегистрСведений.СоответствияОбъектовИнформационныхБаз");
	
	НеВыгружатьПоПравилам = ОбменДаннымиВызовСервера.ИменаМетаданныхНеВыгружаемыхОбъектовУзла(УзелИнформационнойБазы);
	Для Каждого ИмяМетаданных Из НеВыгружатьПоПравилам Цикл
		ПараметрыФормы.ИменаСкрываемыхМетаданных.Добавить(ИмяМетаданных);
	КонецЦикла;
	
	ОткрытьФорму("Обработка.РегистрацияИзмененийДляОбменаДанными.Форма", ПараметрыФормы,, УзелИнформационнойБазы);
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Обработчики событий подсистем конфигурации.

// См. ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы.
Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт
	
	Если СтрНайти(ПараметрЗапуска, "ВыполнитьЗагрузкуРасширенийИЗавершитьРаботу") > 0 Тогда
				
		ОбменДаннымиВызовСервера.ВыполнитьЗагрузкуРасширений();
		ПрекратитьРаботуСистемы();
				
	КонецЕсли;
	
	// Если выполняется запуск ИБ для подчиненного узла РИБ,
	// с необходимостью повтора загрузки сообщения обмена, тогда
	// пользователю предлагается принять решение о повторной загрузке
	// или продолжении без загрузки.
	
	ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
	
	Если НЕ ПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") Тогда
		Возврат;
	КонецЕсли;
	
	Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения(
		"ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском", ЭтотОбъект);
	
КонецПроцедуры

// См. ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы.
Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт
	
	ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
	Если ПараметрыРаботыКлиента.Свойство("ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла") Тогда
		
		Для Каждого Окно Из ПолучитьОкна() Цикл
			Если Окно.Основное Тогда
				Окно.Активизировать();
				Прервать;
			КонецЕсли;
		КонецЦикла;
		
		ПараметрыПомощника = Новый Структура;
		ПараметрыПомощника.Вставить("ИмяПланаОбмена",         ПараметрыРаботыКлиента.ИмяПланаОбменаРИБ);
		ПараметрыПомощника.Вставить("ИдентификаторНастройки", ПараметрыРаботыКлиента.ИдентификаторНастройкиУзлаРИБ);
		ПараметрыПомощника.Вставить("НастройкаНовойСинхронизации");
		ПараметрыПомощника.Вставить("ПродолжениеНастройкиВПодчиненномУзлеРИБ");
		
		ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.НастройкаСинхронизации", ПараметрыПомощника);
	КонецЕсли;
	
КонецПроцедуры

// См. ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы.
Процедура ПослеНачалаРаботыСистемы() Экспорт
	
	ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
	Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных ИЛИ ПараметрыРаботыКлиента.РазделениеВключено Тогда
		Возврат;
	КонецЕсли;
		
	Если Не ПараметрыРаботыКлиента.ЭтоГлавныйУзел
		И Не ПараметрыРаботыКлиента.Свойство("ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла")
		И ПараметрыРаботыКлиента.Свойство("ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзла") Тогда
		
		ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзлаПриЗапуске", 1, Истина);
		
	КонецЕсли;
	
КонецПроцедуры

// Открывает форму записи регистра сведений по заданному отбору.
Процедура ОткрытьФормуЗаписиРегистраСведенийПоОтбору(
		Отбор,
		ЗначенияЗаполнения,
		Знач ИмяРегистра,
		ФормаВладелец,
		Знач ИмяФормы = "",
		ПараметрыФормы = Неопределено,
		ОповещениеОЗакрытии = Неопределено) Экспорт
	
	Перем КлючЗаписи;
	
	НаборЗаписейПустой = ОбменДаннымиВызовСервера.НаборЗаписейРегистраПустой(Отбор, ИмяРегистра);
	
	Если Не НаборЗаписейПустой Тогда
		// Создаем через тип, так как находимся на клиенте.
		
		ТипЗначения = Тип("РегистрСведенийКлючЗаписи." + ИмяРегистра);
		Параметры = Новый Массив(1);
		Параметры[0] = Отбор;
		
		КлючЗаписи = Новый(ТипЗначения, Параметры);
	КонецЕсли;
	
	ПараметрыЗаписи = Новый Структура;
	ПараметрыЗаписи.Вставить("Ключ",               КлючЗаписи);
	ПараметрыЗаписи.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения);
	
	Если ПараметрыФормы <> Неопределено Тогда
		
		Для Каждого Элемент Из ПараметрыФормы Цикл
			
			ПараметрыЗаписи.Вставить(Элемент.Ключ, Элемент.Значение);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ПустаяСтрока(ИмяФормы) Тогда
		
		ПолноеИмяФормы = "РегистрСведений.[ИмяРегистра].ФормаЗаписи";
		ПолноеИмяФормы = СтрЗаменить(ПолноеИмяФормы, "[ИмяРегистра]", ИмяРегистра);
		
	Иначе
		
		ПолноеИмяФормы = "РегистрСведений.[ИмяРегистра].Форма.[ИмяФормы]";
		ПолноеИмяФормы = СтрЗаменить(ПолноеИмяФормы, "[ИмяРегистра]", ИмяРегистра);
		ПолноеИмяФормы = СтрЗаменить(ПолноеИмяФормы, "[ИмяФормы]", ИмяФормы);
		
	КонецЕсли;
	
	// открываем форму записи РС
	Если ОповещениеОЗакрытии <> Неопределено Тогда
		ОткрытьФорму(ПолноеИмяФормы, ПараметрыЗаписи, ФормаВладелец, , , , ОповещениеОЗакрытии);
	Иначе
		ОткрытьФорму(ПолноеИмяФормы, ПараметрыЗаписи, ФормаВладелец);
	КонецЕсли;
	
КонецПроцедуры

Процедура ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт
	
	ПараметрыОбработчикаОжидания = Новый Структура;
	ПараметрыОбработчикаОжидания.Вставить("МинимальныйИнтервал", 1);
	ПараметрыОбработчикаОжидания.Вставить("МаксимальныйИнтервал", 15);
	ПараметрыОбработчикаОжидания.Вставить("ТекущийИнтервал", 1);
	ПараметрыОбработчикаОжидания.Вставить("КоэффициентУвеличенияИнтервала", 1.4);
	
КонецПроцедуры

Процедура ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания) Экспорт
	
	ПараметрыОбработчикаОжидания.ТекущийИнтервал = Мин(ПараметрыОбработчикаОжидания.МаксимальныйИнтервал,
		Окр(ПараметрыОбработчикаОжидания.ТекущийИнтервал * ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала, 1));
		
КонецПроцедуры

// Открывает форму выполнения обмена данными для заданного узла плана обмена.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо открыть форму;
//  Владелец               - форма-владелец для открываемой формы;
// 
Процедура ВыполнитьОбменДаннымиОбработкаКоманды(УзелИнформационнойБазы, Владелец,
		АдресДляВосстановленияПароляУчетнойЗаписи = "", Знач АвтоматическаяСинхронизация = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
	
	Если АвтоматическаяСинхронизация = Неопределено Тогда
		АвтоматическаяСинхронизация = (ОбменДаннымиВызовСервера.ВариантОбменаДанными(УзелИнформационнойБазы) = "Синхронизация");
	КонецЕсли;
	
	ИмяФормыПомощника = "";
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
	
	Если АвтоматическаяСинхронизация Тогда
		ИмяФормыПомощника = "Обработка.ВыполнениеОбменаДанными.Форма";
		ПараметрыФормы.Вставить("АдресДляВосстановленияПароляУчетнойЗаписи", АдресДляВосстановленияПароляУчетнойЗаписи);
	Иначе
		ИмяФормыПомощника = "Обработка.ПомощникИнтерактивногоОбменаДанными.Форма";
		ПараметрыФормы.Вставить("РасширенныйРежимДополненияВыгрузки", Истина);
	КонецЕсли;

	ОповещениеОЗакрытии = Неопределено;
	
	Если Не ДополнительныеПараметры = Неопределено Тогда
		
		Если ДополнительныеПараметры.Свойство("ПараметрыПомощника") Тогда
			Для Каждого ТекущийПараметр Из ДополнительныеПараметры.ПараметрыПомощника Цикл
				ПараметрыФормы.Вставить(ТекущийПараметр.Ключ, ТекущийПараметр.Значение);
			КонецЦикла;
		КонецЕсли;
		
		ДополнительныеПараметры.Свойство("ОповещениеОЗакрытии", ОповещениеОЗакрытии);
		
	КонецЕсли;
	
	ОткрытьФорму(ИмяФормыПомощника,
		ПараметрыФормы, Владелец, УзелИнформационнойБазы.УникальныйИдентификатор(), , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

// Запускает получение файла с сервера интерактивно, без расширения для работы с файлами.
//
// Параметры:
//     ПолучаемыйФайл   - Структура - описание файла для получения. Содержит свойства Имя и Хранение.
//     ПараметрыДиалога - Структура - необязательные дополнительные параметры диалога выбора файлов.
//
Процедура ВыбратьИСохранитьФайлНаКлиенте(Знач ПолучаемыйФайл, Знач ПараметрыДиалога = Неопределено) Экспорт
	
	УмолчанияДиалога = Новый Структура;
	УмолчанияДиалога.Вставить("Заголовок",               НСтр("ru = 'Выберите файл для сохранения'"));
	УмолчанияДиалога.Вставить("МножественныйВыбор",      Ложь);
	УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь);
	
	УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ЗаполнитьЗначенияСвойств(ПараметрыСохранения.Диалог, ПараметрыДиалога);
	
	ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, ПолучаемыйФайл.Хранение, ПолучаемыйФайл.Имя, ПараметрыСохранения);
	
КонецПроцедуры

Процедура ОткрытьНастройкиСинхронизацииДанных() Экспорт
	
	ОткрытьФорму("ОбщаяФорма.НастройкиСинхронизацииДанных");
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Экспортные служебные функции-свойства.

// Возвращает максимально допустимое количество полей,
// которые отображаются в помощнике сопоставления объектов ИБ.
//
// Возвращаемое значение:
//     Число - максимальное количество полей для сопоставления.
//
Функция МаксимальноеКоличествоПолейСопоставленияОбъектов() Экспорт
	
	Возврат 5;
	
КонецФункции

// Возвращает структуру статусов выполнения загрузки данных.
//
Функция СтраницыСтатусаЗагрузкиДанных() Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("Неопределено", "СтатусЗагрузкиНеопределено");
	Структура.Вставить("Ошибка",       "СтатусЗагрузкиОшибка");
	Структура.Вставить("Успех",        "СтатусЗагрузкиУспех");
	Структура.Вставить("Выполнение",   "СтатусЗагрузкиВыполнение");
	
	Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", "СтатусЗагрузкиПредупреждение");
	Структура.Вставить("ВыполненоСПредупреждениями",                     "СтатусЗагрузкиПредупреждение");
	Структура.Вставить("Ошибка_ТранспортСообщения",                      "СтатусЗагрузкиОшибка");
	
	Возврат Структура;
КонецФункции

// Возвращает структуру статусов выполнения выгрузки данных.
//
Функция СтраницыСтатусаВыгрузкиДанных() Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("Неопределено", "СтатусВыгрузкиНеопределено");
	Структура.Вставить("Ошибка",       "СтатусВыгрузкиОшибка");
	Структура.Вставить("Успех",        "СтатусВыгрузкиУспех");
	Структура.Вставить("Выполнение",   "СтатусВыгрузкиВыполнение");
	
	Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", "СтатусВыгрузкиПредупреждение");
	Структура.Вставить("ВыполненоСПредупреждениями",                     "СтатусВыгрузкиПредупреждение");
	Структура.Вставить("Ошибка_ТранспортСообщения",                      "СтатусВыгрузкиОшибка");
	
	Возврат Структура;
КонецФункции

// Возвращает структуру с наименованием гиперссылки поля загрузки данных.
//
Функция ЗаголовкиГиперссылокЗагрузкиДанных() Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("Неопределено",               НСтр("ru = 'Получение данных не выполнялось'"));
	Структура.Вставить("Ошибка",                     НСтр("ru = 'Не удалось получить данные'"));
	Структура.Вставить("ВыполненоСПредупреждениями", НСтр("ru = 'Данные получены с предупреждениями'"));
	Структура.Вставить("Успех",                      НСтр("ru = 'Данные успешно получены'"));
	Структура.Вставить("Выполнение",                 НСтр("ru = 'Выполняется получение данных...'"));
	
	Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", НСтр("ru = 'Нет новых данных для получения'"));
	Структура.Вставить("Ошибка_ТранспортСообщения",                      НСтр("ru = 'Не удалось получить данные'"));
	
	Возврат Структура;
КонецФункции

// Возвращает структуру с наименованием гиперссылки поля выгрузки данных.
//
Функция ЗаголовкиГиперссылокВыгрузкиДанных() Экспорт
	
	Структура = Новый Структура;
	Структура.Вставить("Неопределено", НСтр("ru = 'Отправка данных не выполнялась'"));
	Структура.Вставить("Ошибка",       НСтр("ru = 'Не удалось отправить данные'"));
	Структура.Вставить("Успех",        НСтр("ru = 'Данные успешно отправлены'"));
	Структура.Вставить("Выполнение",   НСтр("ru = 'Выполняется отправка данных...'"));
	
	Структура.Вставить("Предупреждение_СообщениеОбменаБылоРанееПринято", НСтр("ru = 'Данные отправлены с предупреждениями'"));
	Структура.Вставить("ВыполненоСПредупреждениями",                     НСтр("ru = 'Данные отправлены с предупреждениями'"));
	Структура.Вставить("Ошибка_ТранспортСообщения",                      НСтр("ru = 'Не удалось отправить данные'"));
	
	Возврат Структура;
КонецФункции

// Открывает форму или гиперссылку с подробным описанием синхронизации данных.
//
Процедура ОткрытьПодробноеОписаниеСинхронизации(СсылкаНаПодробноеОписание) Экспорт
	
	Если ВРег(Лев(СсылкаНаПодробноеОписание, 4)) = "HTTP" Тогда
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(СсылкаНаПодробноеОписание);
		
	Иначе
		
		ОткрытьФорму(СсылкаНаПодробноеОписание);
		
	КонецЕсли;
	
КонецПроцедуры

// Открывает форму для ввода параметров прокси сервера.
//
Процедура ОткрытьФормуПараметровПроксиСервера() Экспорт
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
		МодульПолучениеФайловИзИнтернетаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиент");
		
		ПараметрыФормы = Неопределено;
		Если ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда
			ПараметрыФормы = Новый Структура("НастройкаПроксиНаКлиенте", Истина);
		КонецЕсли;
		
		МодульПолучениеФайловИзИнтернетаКлиент.ОткрытьФормуПараметровПроксиСервера(ПараметрыФормы);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Экспортные служебные процедуры и функции.

// Только для внутреннего использования.
//
Процедура ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском(Параметры, Контекст) Экспорт
	
	Форма = ОткрытьФорму(
		"РегистрСведений.НастройкиТранспортаОбменаДанными.Форма.ПовторнаяСинхронизацияДанныхПередЗапуском", , , , , ,
		Новый ОписаниеОповещения(
			"ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском", ЭтотОбъект, Параметры));
	
	Если Форма = Неопределено Тогда
		ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском("Продолжить", Параметры);
	КонецЕсли;
	
КонецПроцедуры

// Только для внутреннего использования. Продолжение процедуры.
// ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском.
//
Процедура ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском(Результат, Параметры) Экспорт
	
	Если Результат <> "Продолжить" Тогда
		Параметры.Отказ = Истина;
	Иначе
		Параметры.ПолученныеПараметрыКлиента.Вставить(
			"ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском");
	КонецЕсли;
	
	ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения);
	
КонецПроцедуры

// Только для внутреннего использования. Продолжение процедуры.
// ФормаНастройкиПередЗакрытием.
//
Процедура ФормаНастройкиПередЗакрытиемЗавершение(Ответ, Форма) Экспорт
	
	Если Ответ <> КодВозвратаДиалога.Да Тогда
		Возврат;
	КонецЕсли;
	
	Форма.Модифицированность = Ложь;
	Форма.Закрыть();
	
	// Очищаем кэш повторного использования для сброса возможных COM соединений.
	ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры

// Открывает файл в ассоциированном приложении операционной системы.
//
// Параметры:
//     Объект               - Произвольный - объект из которого по имени свойства будет получено имя файла для открытия.
//     ИмяСвойства          - Строка       - имя свойства объекта из которого будет получено имя файла для открытия.
//     СтандартнаяОбработка - Булево       - флаг стандартной обработки, устанавливается в Ложь.
//
Процедура ОбработчикОткрытияФайлаИлиКаталога(Объект, ИмяСвойства, СтандартнаяОбработка = Ложь) Экспорт
	СтандартнаяОбработка = Ложь;
	
	ПолноеИмяФайла = Объект[ИмяСвойства];
	Если ПустаяСтрока(ПолноеИмяФайла) Тогда
		Возврат;
	КонецЕсли;
	
	ФайловаяСистемаКлиент.ОткрытьПроводник(ПолноеИмяФайла);
	
КонецПроцедуры

// Открывает диалог для выбора файлового каталога, запрашивая установку расширения для работы с файлами.
//
// Параметры:
//     Объект                - Произвольный       - объект, в котором будет установлено выбираемое свойство.
//     ИмяСвойства           - Строка             - имя свойства с именем файла, устанавливаемого в объекте. Источник
//                                                  начального значения.
//     СтандартнаяОбработка  - Булево             - флаг стандартной обработки, устанавливается в Ложь.
//     ПараметрыДиалога      - Структура          - необязательные дополнительные параметры диалога выбора каталога.
//     ОповещениеЗавершения  - ОписаниеОповещения - необязательное оповещение, которое будет вызвано со следующими
//                                                  параметрами:
//                                 Результат               - Строка - выбранное значение (массив строк, если был
//                                                                    множественный выбор);
//                                 ДополнительныеПараметры - Неопределено.
//
Процедура ОбработчикВыбораФайловогоКаталога(Объект, Знач ИмяСвойства, СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено) Экспорт
	СтандартнаяОбработка = Ложь;
	
	УмолчанияДиалога = Новый Структура;
	УмолчанияДиалога.Вставить("Заголовок", НСтр("ru = 'Укажите каталог'") );
	
	УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Объект",               Объект);
	ДополнительныеПараметры.Вставить("ИмяСвойства",          ИмяСвойства);
	ДополнительныеПараметры.Вставить("ПараметрыДиалога",     ПараметрыДиалога);
	ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
	
	Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораФайловогоКаталогаЗавершениеПослеВыбораВДиалоге", ЭтотОбъект, ДополнительныеПараметры);
	
	ФайловаяСистемаКлиент.ВыбратьКаталог(Оповещение, ПараметрыДиалога.Заголовок);
	
КонецПроцедуры

// Продолжение процедуры (см. выше).
// 
Процедура ОбработчикВыбораФайловогоКаталогаЗавершениеПослеВыбораВДиалоге(ПутьККаталогу, ДополнительныеПараметры) Экспорт
	
	Если Не ЗначениеЗаполнено(ПутьККаталогу) Тогда
		Возврат;
	КонецЕсли;
	
	Объект = ДополнительныеПараметры.Объект;
	Объект[ДополнительныеПараметры.ИмяСвойства] = ПутьККаталогу;
	
	Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, ПутьККаталогу);
	КонецЕсли;
	
КонецПроцедуры

// Открывает диалог для выбора файла, запрашивая установку расширения для работы с файлами.
//
// Параметры:
//     Объект                - Произвольный       - объект, в котором будет установлено выбираемое свойство.
//     ИмяСвойства           - Строка             - имя свойства с именем файла, устанавливаемого в объекте. Источник
//                                                  начального значения.
//     СтандартнаяОбработка  - Булево             - флаг стандартной обработки, устанавливается в Ложь.
//     ПараметрыДиалога      - Структура          - необязательные дополнительные параметры диалога выбора файла.
//     ОповещениеЗавершения  - ОписаниеОповещения - необязательное оповещение, которое будет вызвано со следующими
//                                                  параметрами:
//                                 Результат               - Строка
//                                                         - Неопределено - выбранное значение (массив строк,
//                                                                          если был множественный выбор), или
//                                                                          Неопределено - если ничего не выбрано;
//                                 ДополнительныеПараметры - Неопределено.
//
//
Процедура ОбработчикВыбораФайла(Объект, Знач ИмяСвойства, СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено) Экспорт
	
	СтандартнаяОбработка = Ложь;
	
	УмолчанияДиалога = Новый Структура;
	УмолчанияДиалога.Вставить("Режим",                       РежимДиалогаВыбораФайла.Открытие);
	УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина);
	УмолчанияДиалога.Вставить("Заголовок",                   НСтр("ru = 'Выберите файл'"));
	УмолчанияДиалога.Вставить("МножественныйВыбор",          Ложь);
	УмолчанияДиалога.Вставить("ПредварительныйПросмотр",     Ложь);
	УмолчанияДиалога.Вставить("ПолноеИмяФайла",              Объект[ИмяСвойства]);
	
	УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
	
	Диалог = Новый ДиалогВыбораФайла(ПараметрыДиалога.Режим);
	ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Объект",               Объект);
	ДополнительныеПараметры.Вставить("ИмяСвойства",          ИмяСвойства);
	ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
	
	Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораФайлаЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	
	ФайловаяСистемаКлиент.ПоказатьДиалогВыбора(Оповещение, Диалог);
	
КонецПроцедуры

// Обработчик асинхронного диалога выбора файла (завершение).
//
Процедура ОбработчикВыбораФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если Не ЗначениеЗаполнено(ВыбранныеФайлы) Тогда
		Возврат;
	КонецЕсли;
	
	Объект      = ДополнительныеПараметры.Объект;
	ИмяСвойства = ДополнительныеПараметры.ИмяСвойства;
	
	Результат = Неопределено;
	
	Если ВыбранныеФайлы.Количество() > 1 Тогда
		Результат = ВыбранныеФайлы;
	Иначе
		Результат = ВыбранныеФайлы[0];
		
		Объект[ИмяСвойства] = Результат;
	КонецЕсли;
	
	Если Не ДополнительныеПараметры.ОповещениеЗавершения = Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат);
	КонецЕсли;
	
КонецПроцедуры

// Передает файл на сервер интерактивно, без расширения для работы с файлами.
//
// Параметры:
//     ОповещениеЗавершения - ОписаниеОповещения - экспортная процедура, которая будет вызвано со следующими
//                                                 параметрами:
//                                Результат               - Структура - с полями Имя, Хранение, ОписаниеОшибки.
//                                ДополнительныеПараметры - Неопределено.
//
//     ПараметрыДиалога     - Структура                       - необязательные дополнительные параметры диалога выбора
//                                                              файлов.
//     ИдентификаторФормы   - Строка
//                          - УникальныйИдентификатор - параметр для хранилища.
//
Процедура ВыбратьИПередатьФайлНаСервер(ОповещениеЗавершения, Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт
	
	УмолчанияДиалога = Новый Структура;
	УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина);
	УмолчанияДиалога.Вставить("Заголовок",                   НСтр("ru = 'Выберите файл'"));
	УмолчанияДиалога.Вставить("МножественныйВыбор",          Ложь);
	УмолчанияДиалога.Вставить("ПредварительныйПросмотр",     Ложь);
	
	УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога);
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения);
	
	Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалогеЗавершение", ЭтотОбъект, ДополнительныеПараметры);
	
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.ИдентификаторФормы = ИдентификаторФормы;
	ЗаполнитьЗначенияСвойств(ПараметрыЗагрузки.Диалог, ПараметрыДиалога);
	
	ФайловаяСистемаКлиент.ЗагрузитьФайл(Оповещение, ПараметрыЗагрузки);

КонецПроцедуры

// Обработчик немодального завершения выбора и передачи файлов на сервер.
//
Процедура ВыбратьИПередатьФайлНаСерверПослеВыбораВДиалогеЗавершение(ПомещенныйФайл, ДополнительныеПараметры) Экспорт
	
	Если ПомещенныйФайл = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Результат  = Новый Структура("Имя, Хранение, ОписаниеОшибки");
	Результат.Имя      = ПомещенныйФайл.Имя;
	Результат.Хранение = ПомещенныйФайл.Хранение;
	
	// Оповещаем исходного вызывающего.
	ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат);
	
КонецПроцедуры

// Добавляет поля в целевую структуру, если их там нет.
//
// Параметры:
//     Результат           - Структура - целевая структура.
//     ЗначенияПоУмолчанию - Структура
//
Процедура УстановитьЗначенияСтруктурыПоУмолчанию(Результат, Знач ЗначенияПоУмолчанию)
	
	Если Результат = Неопределено Тогда
		Результат = Новый Структура;
	КонецЕсли;
	
	Для Каждого КлючЗначение Из ЗначенияПоУмолчанию Цикл
		ИмяСвойства = КлючЗначение.Ключ;
		Если Не Результат.Свойство(ИмяСвойства) Тогда
			Результат.Вставить(ИмяСвойства, КлючЗначение.Значение);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

// Открывает форму загрузки правил конвертации и регистрации единым файлом.
//
Процедура ЗагрузитьПравилаСинхронизацииДанных(Знач ИмяПланаОбмена) Экспорт
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ИмяПланаОбмена", ИмяПланаОбмена);
	
	ОткрытьФорму("РегистрСведений.ПравилаДляОбменаДанными.Форма.ЗагрузитьПравилаСинхронизацииДанных", ПараметрыФормы,, ИмяПланаОбмена);
	
КонецПроцедуры

// Открывает журнал регистрации с отбором по событиям выгрузки или загрузки данных для заданного узла плана обмена.
// 
Процедура ПерейтиВЖурналРегистрацииСобытийДанных(УзелИнформационнойБазы, ПараметрыВыполненияКоманды, ДействиеПриОбменеСтрокой) Экспорт
	
	СобытиеЖурналаРегистрации = ОбменДаннымиВызовСервера.КлючСообщенияЖурналаРегистрацииПоСтрокеДействия(УзелИнформационнойБазы, ДействиеПриОбменеСтрокой);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрации);
	
	ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно);
	
КонецПроцедуры

Функция СобытиеЖурналаРегистрацииОбменДанными() Экспорт
	
	Возврат НСтр("ru = 'Обмен данными'", ОбщегоНазначенияКлиент.КодОсновногоЯзыка());
	
КонецФункции

// Открывает форму интерактивного выполнения обмена данными для заданного узла плана обмена.
//
// Параметры:
//  УзелИнформационнойБазы  - ПланОбменаСсылка - узел плана обмена, для которого необходимо открыть форму;
//  Владелец                - форма-владелец для открываемой формы;
//  ДополнительныеПараметры - Структура - структура дополнительных параметров открытия помощника:
//    * ПараметрыПомощника  - Структура - произвольная структура, которая будет передана в открываемую форму помощника;
//    * ОповещениеОЗакрытии - ОписаниеОповещения - описание оповещения, которое будет вызвано при закрытии формы помощника.
//
Процедура ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(УзелИнформационнойБазы,
		Владелец, ДополнительныеПараметры = Неопределено) Экспорт
	
	// Открываем форму помощника сопоставления объектов;
	// в качестве параметра формы задаем узел информационной базы;
	ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы);
	ПараметрыФормы.Вставить("РасширенныйРежимДополненияВыгрузки", Истина);
	
	ОповещениеОЗакрытии = Неопределено;
	
	Если Не ДополнительныеПараметры = Неопределено Тогда
		
		Если ДополнительныеПараметры.Свойство("ПараметрыПомощника") Тогда
			Для Каждого ТекущийПараметр Из ДополнительныеПараметры.ПараметрыПомощника Цикл
				ПараметрыФормы.Вставить(ТекущийПараметр.Ключ, ТекущийПараметр.Значение);
			КонецЦикла;
		КонецЕсли;
		
		ДополнительныеПараметры.Свойство("ОповещениеОЗакрытии", ОповещениеОЗакрытии);
		
	КонецЕсли;
	
	ОткрытьФорму("Обработка.ПомощникИнтерактивногоОбменаДанными.Форма",
		ПараметрыФормы, Владелец, УзелИнформационнойБазы.УникальныйИдентификатор(), , , ОповещениеОЗакрытии, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

// Открывает форму настройки новой синхронизации данных.
//
Процедура ОткрытьФормуНастройкиНовойСинхронизацииДанных(ФормаНовойСинхронизацииДанных = "", ДополнительныеПараметры = Неопределено) Экспорт
	
	Если ПустаяСтрока(ФормаНовойСинхронизацииДанных) Тогда
		ФормаНовойСинхронизацииДанных = "Обработка.ПомощникСозданияОбменаДанными.Форма.НоваяСинхронизацияДанных";
	КонецЕсли;
	
	ОткрытьФорму(ФормаНовойСинхронизацииДанных, ДополнительныеПараметры);
	
КонецПроцедуры

// Открывает форму списка сценариев выполнения обмена данными для заданного узла плана обмена.
//
// Параметры:
//  УзелИнформационнойБазы - ПланОбменаСсылка - узел плана обмена, для которого необходимо открыть форму;
//  Владелец               - форма-владелец для открываемой формы;
//
Процедура ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(УзелИнформационнойБазы, Владелец) Экспорт
	
	ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", УзелИнформационнойБазы);
	
	ОткрытьФорму("Справочник.СценарииОбменовДанными.Форма.НастройкаРасписанияОбменовДанными", ПараметрыФормы, Владелец);
	
КонецПроцедуры

// Оповещает все открытые динамические списки о необходимости обновить отображаемые данные.
//
Процедура ОбновитьВсеОткрытыеДинамическиеСписки() Экспорт
	
	Типы = ОбменДаннымиВызовСервера.ВсеСсылочныеТипыКонфигурации();
	
	Для Каждого Тип Из Типы Цикл
		
		ОповеститьОбИзменении(Тип);
		
	КонецЦикла;
	
КонецПроцедуры

// Регистрирует обработчик для открытия новой формы сразу после закрытия текущей.
// 
Процедура ОткрытьФормуПослеЗакрытияТекущей(ТекущаяФорма, Знач ИмяФормы, Знач Параметры = Неопределено, Знач ПараметрыОткрытия = Неопределено) Экспорт
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("ИмяФормы",          ИмяФормы);
	ДополнительныеПараметры.Вставить("Параметры",         Параметры);
	ДополнительныеПараметры.Вставить("ПараметрыОткрытия", ПараметрыОткрытия);
	
	ДополнительныеПараметры.Вставить("ПредыдущееОповещениеОЗакрытии",  ТекущаяФорма.ОписаниеОповещенияОЗакрытии);
	
	ТекущаяФорма.ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ОбработчикОткрытияФормыПослеЗакрытияТекущей", ЭтотОбъект, ДополнительныеПараметры);
КонецПроцедуры

// Отложенное открытие
Процедура ОбработчикОткрытияФормыПослеЗакрытияТекущей(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт
	
	ПараметрыОткрытия = Новый Структура("Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна");
	ЗаполнитьЗначенияСвойств(ПараметрыОткрытия, ДополнительныеПараметры.ПараметрыОткрытия);
	ОткрытьФорму(ДополнительныеПараметры.ИмяФормы, ДополнительныеПараметры.Параметры,
		ПараметрыОткрытия.Владелец, ПараметрыОткрытия.Уникальность, ПараметрыОткрытия.Окно, 
		ПараметрыОткрытия.НавигационнаяСсылка, ПараметрыОткрытия.ОписаниеОповещенияОЗакрытии, ПараметрыОткрытия.РежимОткрытияОкна);
	
	Если ДополнительныеПараметры.ПредыдущееОповещениеОЗакрытии <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ПредыдущееОповещениеОЗакрытии, РезультатЗакрытия);
	КонецЕсли;
	
КонецПроцедуры

// Открывает инструкцию по восстановлению/изменению пароля синхронизации данных
// с автономным рабочим местом.
//
Процедура ОткрытьИнструкциюКакИзменитьПарольСинхронизацииДанных(Знач АдресДляВосстановленияПароляУчетнойЗаписи) Экспорт
	
	Если ПустаяСтрока(АдресДляВосстановленияПароляУчетнойЗаписи) Тогда
		
		ПоказатьПредупреждение(, НСтр("ru = 'Адрес инструкции для восстановления пароля учетной записи не задан.'"));
		
	Иначе
		
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(АдресДляВосстановленияПароляУчетнойЗаписи);
		
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Локальные служебные процедуры и функции.

Процедура ПриЗакрытииФормыНастройкиУзлаПланаОбмена(Форма, ИмяРеквизитаФормы)
	
	Если Не Форма.ПроверитьЗаполнение() Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого НастройкаОтбора Из Форма[ИмяРеквизитаФормы] Цикл
		
		Если ТипЗнч(Форма[НастройкаОтбора.Ключ]) = Тип("ДанныеФормыКоллекция") Тогда
			
			СтруктураТабличнойЧасти = Форма[ИмяРеквизитаФормы][НастройкаОтбора.Ключ];
			
			Для Каждого Элемент Из СтруктураТабличнойЧасти Цикл
				
				СтруктураТабличнойЧасти[Элемент.Ключ].Очистить();
				
				Для Каждого СтрокаКоллекции Из Форма[НастройкаОтбора.Ключ] Цикл
					
					СтруктураТабличнойЧасти[Элемент.Ключ].Добавить(СтрокаКоллекции[Элемент.Ключ]);
					
				КонецЦикла;
				
			КонецЦикла;
			
		Иначе
			
			Форма[ИмяРеквизитаФормы][НастройкаОтбора.Ключ] = Форма[НастройкаОтбора.Ключ];
			
		КонецЕсли;
		
	КонецЦикла;
	
	Форма.Модифицированность = Ложь;
	Форма.Закрыть(Форма[ИмяРеквизитаФормы]);
	
КонецПроцедуры

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС ИНТЕРАКТИВНОГО ДОПОЛНЕНИЯ ВЫГРУЗКИ
//

// Обработка диалогов интерактивного дополнения.
//
// Параметры:
//     ДополнениеВыгрузки           - Структура
//                                  - ДанныеФормыСтруктура - настройки выгрузки.
//     Владелец, Уникальность, Окно - параметры открытия окна формы.
//
// Возвращаемое значение:
//     Открытая форма
//
Функция ОткрытьФормуДополненияВыгрузкиСценарийУзла(Знач ДополнениеВыгрузки, Знач Владелец=Неопределено, Знач Уникальность=Неопределено, Знач Окно=Неопределено) Экспорт
	
	ПараметрыФормы = Новый Структура("РежимВыбора, ЗакрыватьПриВыборе", Истина, Истина);
	ПараметрыФормы.Вставить("УзелИнформационнойБазы", ДополнениеВыгрузки.УзелИнформационнойБазы);
	ПараметрыФормы.Вставить("ПериодОтбора",           ДополнениеВыгрузки.ПериодОтбораСценарияУзла);
	ПараметрыФормы.Вставить("Отбор",                  ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла);

	Возврат ОткрытьФорму(ДополнениеВыгрузки.ПараметрыСценарияДополнения.ВариантДополнительно.ИмяФормыОтбора,
		ПараметрыФормы, Владелец, Уникальность, Окно);
КонецФункции

// Обработка диалогов интерактивного дополнения.
//
// Параметры:
//     ДополнениеВыгрузки           - Структура
//                                  - ДанныеФормыСтруктура - настройки выгрузки.
//     Владелец, Уникальность, Окно - параметры открытия окна формы.
//
// Возвращаемое значение:
//     Открытая форма
//
Функция ОткрытьФормуДополненияВыгрузкиВсеДокументы(Знач ДополнениеВыгрузки, Знач Владелец=Неопределено, Знач Уникальность=Неопределено, Знач Окно=Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	
	ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Добавление документов для отправки'") );
	ПараметрыФормы.Вставить("ДействиеВыбора", 1);
	
	ПараметрыФормы.Вставить("ВыборПериода", Истина);
	ПараметрыФормы.Вставить("ПериодДанных", ДополнениеВыгрузки.ПериодОтбораВсехДокументов);
	
	ПараметрыФормы.Вставить("АдресКомпоновщикаНастроек", ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов);
	
	ПараметрыФормы.Вставить("АдресХранилищаФормы", ДополнениеВыгрузки.АдресХранилищаФормы);
	
	Возврат ОткрытьФорму("Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.РедактированиеПериодаИОтбора", 
		ПараметрыФормы, Владелец, Уникальность, Окно);
КонецФункции

// Обработка диалогов интерактивного дополнения.
//
// Параметры:
//     ДополнениеВыгрузки           - Структура
//                                  - ДанныеФормыСтруктура - настройки выгрузки.
//     Владелец, Уникальность, Окно - параметры открытия окна формы.
//
// Возвращаемое значение:
//     Открытая форма
//
Функция ОткрытьФормуДополненияВыгрузкиДетальныйОтбор(Знач ДополнениеВыгрузки, Знач Владелец=Неопределено, Знач Уникальность=Неопределено, Знач Окно=Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	
	ПараметрыФормы.Вставить("ДействиеВыбора", 2);
	ПараметрыФормы.Вставить("НастройкиОбъекта", ДополнениеВыгрузки);
	
	ПараметрыФормы.Вставить("ОткрытаПоСценарию", Истина);
	Возврат ОткрытьФорму("Обработка.ИнтерактивноеИзменениеВыгрузки.Форма", 
		ПараметрыФормы, Владелец, Уникальность, Окно);
КонецФункции

// Обработка диалогов интерактивного дополнения.
//
// Параметры:
//     ДополнениеВыгрузки           - Структура
//                                  - ДанныеФормыСтруктура - настройки выгрузки.
//     Владелец, Уникальность, Окно - параметры открытия окна формы.
//
// Возвращаемое значение:
//     Открытая форма
//
Функция ОткрытьФормуДополненияВыгрузкиСоставДанных(Знач ДополнениеВыгрузки, Знач Владелец=Неопределено, Знач Уникальность=Неопределено, Знач Окно=Неопределено) Экспорт
	ПараметрыФормы = Новый Структура;
	
	ПараметрыФормы.Вставить("НастройкиОбъекта", ДополнениеВыгрузки);
	Если ДополнениеВыгрузки.ВариантВыгрузки=3 Тогда
		ПараметрыФормы.Вставить("УпрощенныйРежим", Истина);
	КонецЕсли;
	
	Возврат ОткрытьФорму("Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.СоставВыгрузки",
		ПараметрыФормы, Владелец, Уникальность, Окно);
КонецФункции

// Обработка диалогов интерактивного дополнения.
//
// Параметры:
//     ДополнениеВыгрузки           - Структура
//                                  - ДанныеФормыСтруктура - настройки выгрузки.
//     Владелец, Уникальность, Окно - параметры открытия окна формы.
//
// Возвращаемое значение:
//     Открытая форма
//
Функция ОткрытьФормуДополненияВыгрузкиСохранениеНастроек(Знач ДополнениеВыгрузки, Знач Владелец=Неопределено, Знач Уникальность=Неопределено, Знач Окно=Неопределено) Экспорт
	ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе, ДействиеВыбора", Истина, 3);
	
	// Компоновщик туда не передаем.
	ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов = Неопределено;
	
	ПараметрыФормы.Вставить("ПредставлениеТекущейНастройки", ДополнениеВыгрузки.ПредставлениеТекущейНастройки);
	ПараметрыФормы.Вставить("Объект", ДополнениеВыгрузки);
	
	Возврат ОткрытьФорму("Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.РедактированиеСоставаНастроек",
		ПараметрыФормы, Владелец, Уникальность, Окно);
КонецФункции

// Обработчик выбора для формы помощников дополнения выгрузки.
// Функция анализирует источник на предмет вызова из дополнения выгрузки и оперирует с данными ДополнениеВыгрузки.
//
// Параметры:
//     ВыбранноеЗначение  - Произвольный                    - результат выбора.
//     ИсточникВыбора     - ФормаКлиентскогоПриложения                - форма, которая произвела выбор.
//     ДополнениеВыгрузки - Структура
//                        - ДанныеФормыКоллекция - корректируемые настройки дополнения выбора.
//
// Возвращаемое значение:
//     Булево - Истина, если выбор вызван одной из форм дополнения выгрузки, Ложь - иначе.
//
Функция ОбработкаВыбораДополненияВыгрузки(Знач ВыбранноеЗначение, Знач ИсточникВыбора, ДополнениеВыгрузки) Экспорт
	
	Если ИсточникВыбора.ИмяФормы="Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.РедактированиеПериодаИОтбора" Тогда
		// Изменение предопределенного отбора "Все документы", действие определяется значением ВыбранноеЗначение.
		Возврат ДополнениеВыгрузкиОбработкаВыбораТиповогоВарианта(ВыбранноеЗначение, ДополнениеВыгрузки);
		
	ИначеЕсли ИсточникВыбора.ИмяФормы="Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.Форма" Тогда
		// Изменение предопределенного отбора "Детально", действие определяется значением ВыбранноеЗначение.
		Возврат ДополнениеВыгрузкиОбработкаВыбораТиповогоВарианта(ВыбранноеЗначение, ДополнениеВыгрузки);
		
	ИначеЕсли ИсточникВыбора.ИмяФормы="Обработка.ИнтерактивноеИзменениеВыгрузки.Форма.РедактированиеСоставаНастроек" Тогда
		// Настройки, действие определяется значением ВыбранноеЗначение.
		Возврат ДополнениеВыгрузкиОбработкаВыбораТиповогоВарианта(ВыбранноеЗначение, ДополнениеВыгрузки);
		
	ИначеЕсли ИсточникВыбора.ИмяФормы=ДополнениеВыгрузки.ПараметрыСценарияДополнения.ВариантДополнительно.ИмяФормыОтбора Тогда
		// Изменение настроек по сценарию узла.
		Возврат ДополнениеВыгрузкиОбработкаВыбораСценарияУзла(ВыбранноеЗначение, ДополнениеВыгрузки);
		
	КонецЕсли;
	
	Возврат Ложь;
КонецФункции

Процедура ЗаполнитьДанныеСтруктуры(Форма)
	
	// Сохраним введенные значения этой программы.
	СтруктураНастроек = Форма.Контекст.НастройкаОтборовНаУзле;
	СоответствующиеРеквизиты = Форма.ИменаРеквизитов;
	
	Для Каждого ЭлементНастройки Из СтруктураНастроек Цикл
		
		Если СоответствующиеРеквизиты.Свойство(ЭлементНастройки.Ключ) Тогда
			
			ИмяРеквизита = СоответствующиеРеквизиты[ЭлементНастройки.Ключ];
			
		Иначе
			
			ИмяРеквизита = ЭлементНастройки.Ключ;
			
		КонецЕсли;
		
		РеквизитФормы = Форма[ИмяРеквизита];
		
		Если ТипЗнч(РеквизитФормы) = Тип("ДанныеФормыКоллекция") Тогда
			
			ИмяТаблицы = ЭлементНастройки.Ключ;
			
			Таблица = Новый Массив;
			
			Для Каждого Элемент Из Форма[ИмяРеквизита] Цикл
				
				СтрокаТаблицы = Новый Структура("Использовать, Представление, УникальныйИдентификаторСсылки");
				
				ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Элемент);
				
				Таблица.Добавить(СтрокаТаблицы);
				
			КонецЦикла;
			
			СтруктураНастроек.Вставить(ИмяТаблицы, Таблица);
			
		Иначе
			
			СтруктураНастроек.Вставить(ЭлементНастройки.Ключ, Форма[ИмяРеквизита]);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Форма.Контекст.НастройкаОтборовНаУзле = СтруктураНастроек;
	
	// Сохраним введенные значения другой программы.
	СтруктураНастроек = Форма.Контекст.НастройкаОтборовНаУзлеБазыКорреспондента;
	СоответствующиеРеквизиты = Форма.ИменаРеквизитовБазыКорреспондента;
	
	Для Каждого ЭлементНастройки Из СтруктураНастроек Цикл
		
		Если СоответствующиеРеквизиты.Свойство(ЭлементНастройки.Ключ) Тогда
			
			ИмяРеквизита = СоответствующиеРеквизиты[ЭлементНастройки.Ключ];
			
		Иначе
			
			ИмяРеквизита = ЭлементНастройки.Ключ;
			
		КонецЕсли;
		
		РеквизитФормы = Форма[ИмяРеквизита];
		
		Если ТипЗнч(РеквизитФормы) = Тип("ДанныеФормыКоллекция") Тогда
			
			ИмяТаблицы = ЭлементНастройки.Ключ;
			
			Таблица = Новый Массив;
			
			Для Каждого Элемент Из Форма[ИмяРеквизита] Цикл
				
				СтрокаТаблицы = Новый Структура("Использовать, Представление, УникальныйИдентификаторСсылки");
				
				ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Элемент);
				
				Таблица.Добавить(СтрокаТаблицы);
				
			КонецЦикла;
			
			СтруктураНастроек.Вставить(ИмяТаблицы, Таблица);
			
		Иначе
			
			СтруктураНастроек.Вставить(ЭлементНастройки.Ключ, Форма[ИмяРеквизита]);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Форма.Контекст.НастройкаОтборовНаУзлеБазыКорреспондента = СтруктураНастроек;
	
	Форма.Контекст.Вставить("ОписаниеКонтекста", Форма.ОписаниеКонтекста);
	
КонецПроцедуры

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ ИНТЕРАКТИВНОГО ДОПОЛНЕНИЯ ВЫГРУЗКИ
//

Функция ДополнениеВыгрузкиОбработкаВыбораТиповогоВарианта(Знач ВыбранноеЗначение, ДополнениеВыгрузки)
	
	Результат = Ложь;
	Если ТипЗнч(ВыбранноеЗначение)=Тип("Структура") Тогда 
		
		Если ВыбранноеЗначение.ДействиеВыбора=1 Тогда
			// Отбор и период всех документов.
			ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов = Неопределено;
			ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов = ВыбранноеЗначение.АдресКомпоновщикаНастроек;
			ДополнениеВыгрузки.ПериодОтбораВсехДокументов      = ВыбранноеЗначение.ПериодДанных;
			Результат = Истина;
			
		ИначеЕсли ВыбранноеЗначение.ДействиеВыбора=2 Тогда
			// Детальная настройка
			ОбъектВыбора = ПолучитьИзВременногоХранилища(ВыбранноеЗначение.АдресОбъекта);
			ЗаполнитьЗначенияСвойств(ДополнениеВыгрузки, ОбъектВыбора, , "ДополнительнаяРегистрация");
			ДополнениеВыгрузки.ДополнительнаяРегистрация.Очистить();
			Для Каждого Строка Из ОбъектВыбора.ДополнительнаяРегистрация Цикл
				ЗаполнитьЗначенияСвойств(ДополнениеВыгрузки.ДополнительнаяРегистрация.Добавить(), Строка);
			КонецЦикла;
			Результат = Истина;
			
		ИначеЕсли ВыбранноеЗначение.ДействиеВыбора=3 Тогда
			// Были сохранены настройки, надо запомнить текущее имя.
			ДополнениеВыгрузки.ПредставлениеТекущейНастройки = ВыбранноеЗначение.ПредставлениеНастройки;
			Результат = Истина;
			
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

Функция ДополнениеВыгрузкиОбработкаВыбораСценарияУзла(Знач ВыбранноеЗначение, ДополнениеВыгрузки)
	Если ТипЗнч(ВыбранноеЗначение)<>Тип("Структура") Тогда 
		Возврат Ложь;
	КонецЕсли;
	
	ДополнениеВыгрузки.ПериодОтбораСценарияУзла        = ВыбранноеЗначение.ПериодОтбора;
	ДополнениеВыгрузки.ПредставлениеОтбораСценарияУзла = ВыбранноеЗначение.ПредставлениеОтбора;
	
	ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла.Очистить();
	Для Каждого СтрокаРегистрации Из ВыбранноеЗначение.Отбор Цикл
		ЗаполнитьЗначенияСвойств(ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла.Добавить(), СтрокаРегистрации);
	КонецЦикла;
	
	Возврат Истина;
КонецФункции

Функция ПроверитьИЗарегистрироватьCOMСоединитель(Знач СтрукураНастроек, Оповещение = Неопределено) Экспорт
	
	Если НЕ ОбщегоНазначенияКлиент.ИнформационнаяБазаФайловая() Тогда
		Возврат Истина;
	КонецЕсли;
	
	Если НЕ ОбменДаннымиВызовСервера.ПроверитьИЗарегистрироватьCOMСоединитель(СтрукураНастроек) Тогда
		ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Ложь, Оповещение);
	КонецЕсли;
	
КонецФункции

#КонецОбласти